package com.taobao.top.api;

import java.util.TreeMap;

import com.taobao.top.api.exception.ApiException;
import com.taobao.top.beans.AppConstants;
import com.taobao.top.utils.APIUtil;

/**
 * 交易API
 * <p>
 * 提供了订单下载，修改收货地址、修改交易备注等功能
 * 
 * @see http://open.taobao.com/doc/api_cat_detail.htm?cat_id=5&category_id=102
 * @version 1.0
 */
public class Jiaoyi_API
{
	/**
	 * <p>
	 * 使用指南：http://open.taobao.com/doc/detail.htm?id=30
	 * </p>
	 * <p>
	 * 1.此接口用于获取异步任务处理的结果，传入的task_id必需属于当前的appKey才可以
	 * </p>
	 * <p>
	 * 2.此接口只返回执行完成的任务结果，未执行完的返回结果里面不包含任务结果，只有任务id，执行状态
	 * </p>
	 * <p>
	 * 3.执行完成的每个task的子任务结果内容与单个任务的结果结构一致。
	 * </p>
	 * <p>
	 * 如：taobao.topats.trades.fullinfo.get返回的子任务结果就会是Trade的结构体。
	 * </p>
	 * 
	 * @param format
	 * @param mTask_id
	 *            任务id号，创建任务时返回的task_id
	 * @return 返回的是XML或者JSON字符串格式的User类型，我一致返回为字符串类型，让用户在客户端解析
	 * @throws ApiException
	 */
	public String getResult(String format, String mTask_id) throws ApiException
	{
		TreeMap<String, String> apiparamsMap = new TreeMap<String, String>();
		apiparamsMap.putAll(APIUtil.getSystemParams());
		if (format != null || !format.equals(""))
		{
			apiparamsMap.put("format", format);
		}
		apiparamsMap.put("method", "taobao.topats.result.get");
		apiparamsMap.put("task_id", mTask_id);
		String sign = APIUtil.md5Signature(apiparamsMap, AppConstants.SECRET);
		apiparamsMap.put("sign", sign);

		String paramsString = APIUtil.getContent(apiparamsMap);
		String responseData = APIUtil.getResult(AppConstants.APIURL,
				paramsString);

		return responseData;
	}

	/**
	 * <p>
	 * 使用指南：http://api.taobao.com/apidoc/api.htm?path=cid:5-apiId:10461
	 * </p>
	 * <p>
	 * 1.提供异步下载用户支付宝对账信息接口
	 * </p>
	 * <p>
	 * 2.一次调用最多支持下载3个月的对账信息
	 * </p>
	 * <p>
	 * 3.仅能获取2010年6月10日以后的信息
	 * </p>
	 * <p>
	 * 4.提交任务会进行初步任务校验，如果成功会返回任务号和创建时间，如果失败就报错
	 * </p>
	 * <p>
	 * 5.可以接收淘宝发出的任务完成消息，也可以过一段时间来取结果。获取结果接口为taobao.topats.result.get
	 * </p>
	 * <p>
	 * 6.支付宝证书签名方法见文档：“http://open.taobao.com/dev/index.php/如何数字证书签名”
	 * </p>
	 * <p>
	 * 7.此api执行完成发送的通知消息格式为{"task":{"task_id":123456,"created":"2010-8-19"}}
	 * </p>
	 * <p>
	 * 8.此任务是大数据任务，获取任务结果时只能得到下载url
	 * </p>
	 * <p>
	 * 9.子任务结果解析见TradeAccountDetail结构体说明
	 * </p>
	 * <p>
	 * 10.此接口执行任务时间段为：00:00:00-09:30:00;11:00:00-14:00:00;17:00:00-20:00:00;22:
	 * 30:00-23:59:59，只有在这段时间内才能返回查询结果
	 * </p>
	 * 
	 * @param format
	 * @param mStart_created
	 *            <p>
	 *            账务日期开始时间，时间必须大于2010-06-10 00:00:00
	 *            </p>
	 * @param mEnd_created
	 *            <p>
	 *            账务日期查询结束时间。查询结束时间必须大于查询开始时间，并且时间跨度不能超过3个月。
	 *            </p>
	 * @param mFields
	 *            <p>
	 *            返回信息包含的字段，详情请见TradeAccountDetail结构体说明<a>
	 *            http://api.taobao.com/
	 *            apidoc/dataStruct.htm?path=cid:5-dataStructId:10152</a>
	 *            </p>
	 * @return <p>
	 *         创建任务信息。里面只包含task_id和created
	 *         </p>
	 */
	public String getAccountreport(String format, String mStart_created,
			String mEnd_created, String mFields) throws ApiException
	{
		TreeMap<String, String> apiparamsMap = new TreeMap<String, String>();
		apiparamsMap.putAll(APIUtil.getSystemParams());
		if (format != null || !format.equals(""))
		{
			apiparamsMap.put("format", format);
		}
		apiparamsMap.put("method", "taobao.topats.trade.accountreport.get");
		apiparamsMap.put("start_created", mStart_created);
		apiparamsMap.put("end_created", mEnd_created);
		apiparamsMap.put("fields", mFields);

		String sign = APIUtil.md5Signature(apiparamsMap, AppConstants.SECRET);
		apiparamsMap.put("sign", sign);

		String paramsString = APIUtil.getContent(apiparamsMap);
		String responseData = APIUtil.getResult(AppConstants.APIURL,
				paramsString);

		return responseData;
	}

	/**
	 * <p>
	 * 使用指南：<a>http://open.taobao.com/dev/index.php/ATS%E4%BD%BF%E7%94%A8%E6%8C%
	 * 87%E5%8D%97</a>
	 * <p>
	 * 1.提供异步批量获取订单详情功能
	 * <p>
	 * 2.一次调用最多支持40个订单
	 * <p>
	 * 3.提交任务会进行初步任务校验，如果成功会返回任务号和创建时间，如果失败就报错
	 * <p>
	 * 4.可以接收淘宝发出的任务完成消息，也可以过一段时间来取结果。获取结果接口为taobao.topats.result.get
	 * <p>
	 * 5.此api执行完成发送的通知消息格式为{"task":{"task_id":123456,"created":"2010-8-19"}}
	 * 
	 * @param format
	 * @param mFields
	 *            <p>
	 *            指定此字段表示获取的所有订单都按照这个字段请求来返回，
	 *            同（taobao.trade.fullinfo.get的fields一样）。
	 *            1.Trade中可以指定返回的fields：seller_nick, buyer_nick, title, type,
	 *            created, sid, tid, seller_rate, buyer_rate, status, payment,
	 *            discount_fee, adjust_fee, post_fee, total_fee, pay_time,
	 *            end_time, modified, consign_time, buyer_obtain_point_fee,
	 *            point_fee, real_point_fee, received_payment, commission_fee,
	 *            buyer_memo, seller_memo, alipay_no, buyer_message, pic_path,
	 *            num_iid, num, price, buyer_alipay_no, receiver_name,
	 *            receiver_state, receiver_city, receiver_district,
	 *            receiver_address, receiver_zip, receiver_mobile,
	 *            receiver_phone, buyer_email, seller_alipay_no, seller_mobile,
	 *            seller_phone, seller_name, seller_email,
	 *            available_confirm_fee, has_post_fee, timeout_action_time,
	 *            snapshot_url, cod_fee, cod_status, shipping_type, trade_memo,
	 *            is_3D 2.Order中可以指定返回fields：orders.title, orders.pic_path,
	 *            orders.price, orders.num, orders.num_iid, orders.sku_id,
	 *            orders.refund_status, orders.status, orders.oid,
	 *            orders.total_fee, orders.payment, orders.discount_fee,
	 *            orders.adjust_fee, orders.snapshot_url,
	 *            orders.timeout_action_time，orders.sku_properties_name,
	 *            orders.item_meal_name, item_memo,orders.buyer_rate,
	 *            orders.seller_rate, orders.outer_iid, orders.outer_sku_id,
	 *            orders.refund_id, orders.seller_type
	 *            3.fields：orders（返回Order的所有内容）
	 *            </p>
	 * @param mTids
	 *            <p>
	 *            批量获取的订单id列表，每个订单id必需是合法的数字类型的tid，每个tid之间以";"分隔，至少要指定一个tid，
	 *            最多不超过40个tid
	 *            </p>
	 * @return<p>创建任务信息。里面只包含task_id和created</p>
	 */
	public String getFullinfo(String format, String mFields, String mTids)
			throws ApiException
	{
		TreeMap<String, String> apiparamsMap = new TreeMap<String, String>();
		apiparamsMap.putAll(APIUtil.getSystemParams());
		if (format != null || !format.equals(""))
		{
			apiparamsMap.put("format", format);
		}
		apiparamsMap.put("fields", mFields);
		apiparamsMap.put("tids", mTids);

		String sign = APIUtil.md5Signature(apiparamsMap, AppConstants.SECRET);
		apiparamsMap.put("sign", sign);

		String paramsString = APIUtil.getContent(apiparamsMap);
		String responseData = APIUtil.getResult(AppConstants.APIURL,
				paramsString);

		return responseData;
	}

	/**
	 * <p>
	 * 使用指南<a>http://api.taobao.com/apidoc/api.htm?path=cid:5-apiId:10481</a>
	 * </p>
	 * <p>
	 * 卖家查询该笔交易订单的资金帐务相关的数据；
	 * </p>
	 * <p>
	 * 1. 只供卖家使用，买家不可使用
	 * </p>
	 * <p>
	 * 2. 可查询所有的状态的订单，但不同状态时订单的相关数据可能会有不同
	 * </p>
	 * 
	 * @param format
	 * @param mTid
	 * @param mFields
	 * @return<p>主订单的财务信息详情</p>
	 */
	public String getAmount(String format, String mTid, String mFields)
			throws ApiException
	{
		TreeMap<String, String> apiparamsMap = new TreeMap<String, String>();
		apiparamsMap.putAll(APIUtil.getSystemParams());
		if (format != null || !format.equals(""))
		{
			apiparamsMap.put("format", format);
		}
		apiparamsMap.put("tid", mTid);
		apiparamsMap.put("fields", mFields);

		String sign = APIUtil.md5Signature(apiparamsMap, AppConstants.SECRET);
		apiparamsMap.put("sign", sign);

		String paramsString = APIUtil.getContent(apiparamsMap);
		String responseData = APIUtil.getResult(AppConstants.APIURL,
				paramsString);
		return responseData;
	}

	/**
	 * <p>
	 * 使用指南<a>http://api.taobao.com/apidoc/api.htm?path=cid:5-apiId:83</a>
	 * </p>
	 * <p>
	 * <a>关闭一笔订单，可以是主订单或子订单。</a>
	 * </p>
	 * 
	 * @param format
	 * @param mTid
	 *            <p>
	 *            主订单或子订单编号。
	 *            </p>
	 * @param mClose_reason
	 *            <p>
	 *            交易关闭原因。
	 *            </p>
	 * @return <p>
	 *         关闭交易时返回的Trade信息，可用字段有tid和modified
	 *         </p>
	 * @throws ApiException
	 */
	public String close(String format, String mTid, String mClose_reason)
			throws ApiException
	{
		TreeMap<String, String> apiparamsMap = new TreeMap<String, String>();
		apiparamsMap.putAll(APIUtil.getSystemParams());
		if (format != null || !format.equals(""))
		{
			apiparamsMap.put("format", format);
		}
		apiparamsMap.put("tid", mTid);
		apiparamsMap.put("close_reason", mClose_reason);
		String sign = APIUtil.md5Signature(apiparamsMap, AppConstants.SECRET);
		apiparamsMap.put("sign", sign);

		String paramsString = APIUtil.getContent(apiparamsMap);
		String responseData = APIUtil.getResult(AppConstants.APIURL,
				paramsString);

		return responseData;
	}

	/**
	 * <p>
	 * 使用指南<a>http://api.taobao.com/apidoc/api.htm?path=cid:5-apiId:146</a>
	 * </p>
	 * 获取交易确认收货费用 可以获取主订单或子订单的确认收货费用
	 * 
	 * @param format
	 * @param mTid
	 *            <p>
	 *            交易编号，或子订单编号
	 *            </p>
	 * @param mIs_detail
	 *            <p>
	 *            是否是子订单。可选值:IS_FATHER(父订单),IS_CHILD(子订单)
	 *            </p>
	 * @return <p>
	 *         获取到的交易确认收货费用
	 *         </p>
	 * @throws ApiException
	 */
	public String getConfirmfee(String format, String mTid, String mIs_detail)
			throws ApiException
	{
		TreeMap<String, String> apiparamsMap = new TreeMap<String, String>();
		apiparamsMap.putAll(APIUtil.getSystemParams());
		if (format != null || !format.equals(""))
		{
			apiparamsMap.put("format", format);
		}
		apiparamsMap.put("tid", mTid);
		apiparamsMap.put("is_detail", mIs_detail);

		String sign = APIUtil.md5Signature(apiparamsMap, AppConstants.SECRET);
		apiparamsMap.put("sign", sign);

		String paramsString = APIUtil.getContent(apiparamsMap);
		String responseData = APIUtil.getResult(AppConstants.APIURL,
				paramsString);

		return responseData;
	}

	/**
	 * <p>
	 * 获取单笔交易的详细信息
	 * </p>
	 * <p>
	 * 1.只有在交易成功的状态下才能取到交易佣金，其它状态下取到的都是零或空值
	 * </p>
	 * <p>
	 * 2.只有单笔订单的情况下Trade数据结构中才包含商品相关的信息
	 * </p>
	 * <p>
	 * 3.获取到的Order中的payment字段在单笔子订单时包含物流费用，多笔子订单时不包含物流费用
	 * </p>
	 * <p>
	 * 注：包含以下字段的返回会增加TOP的后台压力，请仅在确实需要的情况下才去获取
	 * </p>
	 * 
	 * @param format
	 * @param mFields
	 * @param mTid
	 *            交易编号
	 * @return
	 * @throws ApiException
	 */
	public String getFullInfo(String format, String mFields, String mTid)
			throws ApiException
	{
		TreeMap<String, String> apiparamsMap = new TreeMap<String, String>();
		apiparamsMap.putAll(APIUtil.getSystemParams());
		if (format != null || !format.equals(""))
		{
			apiparamsMap.put("format", format);
		}
		apiparamsMap.put("tid", mTid);
		apiparamsMap.put("Field List", mFields);

		String sign = APIUtil.md5Signature(apiparamsMap, AppConstants.SECRET);
		apiparamsMap.put("sign", sign);

		String paramsString = APIUtil.getContent(apiparamsMap);
		String responseData = APIUtil.getResult(AppConstants.APIURL,
				paramsString);

		return responseData;
	}

	/**
	 * 获取单笔交易的部分信息
	 * 
	 * @param format
	 * @param mFields
	 * @param mTid
	 *            交易编号
	 * @return 搜索到的交易信息列表，返回的Trade和Order中包含的具体信息为入参fields请求的字段信息
	 * @throws ApiException
	 */
	public String get(String format, String mFields, String mTid)
			throws ApiException
	{
		TreeMap<String, String> apiparamsMap = new TreeMap<String, String>();
		apiparamsMap.putAll(APIUtil.getSystemParams());
		if (format != null || !format.equals(""))
		{
			apiparamsMap.put("format", format);
		}
		apiparamsMap.put("tid", mTid);
		apiparamsMap.put("Field List", mFields);

		String sign = APIUtil.md5Signature(apiparamsMap, AppConstants.SECRET);
		apiparamsMap.put("sign", sign);

		String paramsString = APIUtil.getContent(apiparamsMap);
		String responseData = APIUtil.getResult(AppConstants.APIURL,
				paramsString);

		return responseData;
	}

	/**
	 * <p>
	 * 根据登录用户的身份（买家或卖家），自动添加相应的交易备注,不能重复调用些接口添加备注，需要更新备注请用taobao.trade.memo.
	 * update
	 * </p>
	 * 
	 * @param format
	 * @param mMemo
	 *            交易备注。最大长度: 1000个字节
	 * @param mTid
	 *            交易编号
	 * @param flag
	 *            交易备注旗帜，可选值为：0(灰色), 1(红色), 2(黄色), 3(绿色), 4(蓝色), 5(粉红色)，默认值为0
	 * @return 对一笔交易添加备注后返回其对应的Trade，Trade中可用的返回字段有tid和created
	 * @throws ApiException
	 */
	public String addMemo(String format, String mMemo, String mTid, String flag)
			throws ApiException
	{
		TreeMap<String, String> apiparamsMap = new TreeMap<String, String>();
		apiparamsMap.putAll(APIUtil.getSystemParams());
		if (format != null || !format.equals(""))
		{
			apiparamsMap.put("format", format);
		}
		apiparamsMap.put("tid", mTid);
		apiparamsMap.put("memo", mMemo);
		if (flag != null || !flag.equals(""))
		{
			apiparamsMap.put("flag", flag);
		}
		String sign = APIUtil.md5Signature(apiparamsMap, AppConstants.SECRET);
		apiparamsMap.put("sign", sign);

		String paramsString = APIUtil.getContent(apiparamsMap);
		String responseData = APIUtil.getResult(AppConstants.APIURL,
				paramsString);

		return responseData;
	}

	/**
	 * 需要商家或以上权限才可调用此接口，可重复调用本接口更新交易备注，本接口同时具有添加备注的功能
	 * 
	 * @param format
	 * @param memo
	 *            交易备注。最大长度: 1000个字节
	 * @param mTid
	 *            交易编号
	 * @param flag
	 *            交易备注旗帜，可选值为：0(灰色), 1(红色), 2(黄色), 3(绿色), 4(蓝色), 5(粉红色)，默认值为0
	 * @param reset
	 *            <p>
	 *            是否对memo的值置空 若为true，
	 *            </p>
	 *            <p>
	 *            则不管传入的memo字段的值是否为空，都将会对已有的memo值清空，慎用；
	 *            </p>
	 *            <p>
	 *            若用false，则会根据memo是否为空来修改memo的值：
	 *            </p>
	 *            <p>
	 *            若memo为空则忽略对已有memo字段的修改，
	 *            </p>
	 *            <p>
	 *            若memo非空，则使用新传入的memo覆盖已有的memo的值
	 *            </p>
	 * @return 更新交易的备注信息后返回的Trade，其中可用字段为tid和modified
	 * @throws ApiException
	 */
	public String updateMemo(String format, String memo, String mTid,
			String flag, String reset) throws ApiException
	{
		TreeMap<String, String> apiparamsMap = new TreeMap<String, String>();
		apiparamsMap.putAll(APIUtil.getSystemParams());
		if (format != null || !format.equals(""))
		{
			apiparamsMap.put("format", format);
		}
		if (flag != null || !flag.equals(""))
		{
			apiparamsMap.put("flag", flag);
		}
		if (memo != null || !memo.equals(""))
		{
			apiparamsMap.put("memo", memo);
		}
		if (reset != null || !reset.equals(""))
		{
			apiparamsMap.put("reset", reset);
		}
		apiparamsMap.put("tid", mTid);

		String sign = APIUtil.md5Signature(apiparamsMap, AppConstants.SECRET);
		apiparamsMap.put("sign", sign);

		String paramsString = APIUtil.getContent(apiparamsMap);
		String responseData = APIUtil.getResult(AppConstants.APIURL,
				paramsString);

		return responseData;
	}

	/**
	 * 
	 * @param format
	 * @param sku_id
	 *            销售属性编号，可以通过taobao.item.skus.get获取订单对应的商品的所有销售属性。
	 * @param mOid
	 *            子订单编号（对于单笔订单的交易可以传交易编号）
	 * @param sku_props
	 *            销售属性组合串，格式：p1:v1;p2:v2
	 * @return 只返回oid和modified
	 * @throws ApiException
	 */
	public String updateOrdersku(String format, String sku_id, String mOid,
			String sku_props) throws ApiException
	{
		TreeMap<String, String> apiparamsMap = new TreeMap<String, String>();
		apiparamsMap.putAll(APIUtil.getSystemParams());
		if (format != null || !format.equals(""))
		{
			apiparamsMap.put("format", format);
		}
		if (sku_id != null || !sku_id.equals(""))
		{
			apiparamsMap.put("sku_id", sku_id);
		}
		if (sku_props != null || !sku_props.equals(""))
		{
			apiparamsMap.put("sku_props", sku_props);
		}
		apiparamsMap.put("mOid", mOid);

		String sign = APIUtil.md5Signature(apiparamsMap, AppConstants.SECRET);
		apiparamsMap.put("sign", sign);

		String paramsString = APIUtil.getContent(apiparamsMap);
		String responseData = APIUtil.getResult(AppConstants.APIURL,
				paramsString);

		return responseData;
	}

	/**
	 * 修改订单邮费接口，通过传入订单编号和邮费价格，修改订单的邮费，返回修改时间modified,邮费post_fee,总费用total_fee。
	 * 
	 * @param format
	 * @param mPost_fee
	 *            邮费价格(邮费单位是元）
	 * @param mTid
	 *            主订单编号
	 * @return 
	 *         返回trade类型，其中包含修改时间modified，修改邮费post_fee，修改后的总费用total_fee和买家实付款payment
	 * @throws ApiException
	 */
	public String updatePostage(String format, String mPost_fee, String mTid)
			throws ApiException
	{
		TreeMap<String, String> apiparamsMap = new TreeMap<String, String>();
		apiparamsMap.putAll(APIUtil.getSystemParams());
		if (format != null || !format.equals(""))
		{
			apiparamsMap.put("format", format);
		}
		apiparamsMap.put("post_fee", mPost_fee);
		apiparamsMap.put("tid", mTid);

		String sign = APIUtil.md5Signature(apiparamsMap, AppConstants.SECRET);
		apiparamsMap.put("sign", sign);

		String paramsString = APIUtil.getContent(apiparamsMap);
		String responseData = APIUtil.getResult(AppConstants.APIURL,
				paramsString);

		return responseData;
	}

	/**
	 * 延长交易收货时间
	 * 
	 * @param format
	 * @param mDays
	 *            延长收货的天数，可选值为：3, 5, 7, 10
	 * @param mTid
	 *            主订单号
	 * @return
	 * @throws ApiException
	 */
	public String delayReceivetime(String format, String mDays, String mTid)
			throws ApiException
	{
		TreeMap<String, String> apiparamsMap = new TreeMap<String, String>();
		apiparamsMap.putAll(APIUtil.getSystemParams());
		if (format != null || !format.equals(""))
		{
			apiparamsMap.put("format", format);
		}
		apiparamsMap.put("days", mDays);
		apiparamsMap.put("tid", mTid);

		String sign = APIUtil.md5Signature(apiparamsMap, AppConstants.SECRET);
		apiparamsMap.put("sign", sign);

		String paramsString = APIUtil.getContent(apiparamsMap);
		String responseData = APIUtil.getResult(AppConstants.APIURL,
				paramsString);

		return responseData;
	}

	/**
	 * 
	 * @param format
	 * @param receiver_name
	 *            收货人全名。最 大长度为50个字节。
	 * @param receiver_phone
	 *            固定电话。最大长度为30个字节。
	 * @param receiver_mobile
	 *            移动电话。最大长度为30个字节。
	 * @param receiver_state
	 *            省份。最大长度为32个字节。如：浙江
	 * @param receiver_city
	 *            城市。最大长度为32个字节。如：杭州
	 * @param receiver_district
	 *            区/县。最大长度为32个字节。如：西湖区
	 * @param receiver_address
	 *            收货地址。最大长度为228个字节。
	 * @param receiver_zip
	 *            邮政编码。必须由6个数字组成。
	 * @param mTid
	 *            交易编号。
	 * @return 交易结构
	 * @throws ApiException
	 */
	public String updateShippingaddress(String format, String receiver_name,
			String receiver_phone, String receiver_mobile,
			String receiver_state, String receiver_city,
			String receiver_district, String receiver_address,
			String receiver_zip, String mTid) throws ApiException
	{
		TreeMap<String, String> apiparamsMap = new TreeMap<String, String>();
		apiparamsMap.putAll(APIUtil.getSystemParams());
		if (format != null || !format.equals(""))
		{
			apiparamsMap.put("format", format);
		}
		if (receiver_name != null || !receiver_name.equals(""))
		{
			apiparamsMap.put("receiver_name", receiver_name);
		}
		if (receiver_phone != null || !receiver_phone.equals(""))
		{
			apiparamsMap.put("receiver_phone", receiver_phone);
		}
		if (receiver_mobile != null || !receiver_mobile.equals(""))
		{
			apiparamsMap.put("receiver_mobile", receiver_mobile);
		}
		if (receiver_state != null || !receiver_state.equals(""))
		{
			apiparamsMap.put("receiver_state", receiver_state);
		}
		if (receiver_city != null || !receiver_city.equals(""))
		{
			apiparamsMap.put("receiver_city", receiver_city);
		}
		if (receiver_district != null || !receiver_district.equals(""))
		{
			apiparamsMap.put("receiver_district", receiver_district);
		}
		if (receiver_address != null || !receiver_address.equals(""))
		{
			apiparamsMap.put("receiver_address", receiver_address);
		}
		if (receiver_zip != null || !receiver_zip.equals(""))
		{
			apiparamsMap.put("receiver_zip", receiver_zip);
		}
		apiparamsMap.put("tid", mTid);

		String sign = APIUtil.md5Signature(apiparamsMap, AppConstants.SECRET);
		apiparamsMap.put("sign", sign);

		String paramsString = APIUtil.getContent(apiparamsMap);
		String responseData = APIUtil.getResult(AppConstants.APIURL,
				paramsString);

		return responseData;
	}

	/**
	 * <p>
	 * 交易快照查询 目前只支持类型为“旺店标准版(600)”或“旺店入门版(610)”的交易 对于“旺店标准版”类型的交易
	 * </p>
	 * <p>
	 * 返回的snapshot字段为交易快照编号 对于“旺店入门版”类型的交易，
	 * </p>
	 * <p>
	 * 返回的snapshot字段为JSON结构的数据(其中的shopPromotion包含了优惠，积分等信息）
	 * </p>
	 * 
	 * @param format
	 * @param mFields
	 *            需要返回的字段列表。现只支持："snapshot"字段
	 * @param mTid
	 *            交易编号
	 * @return 只包含Trade中的tid和snapshot、子订单Order中的oid和snapshot
	 * @throws ApiException
	 */
	public String getSnapshot(String format, String mFields, String mTid)
			throws ApiException
	{
		TreeMap<String, String> apiparamsMap = new TreeMap<String, String>();
		apiparamsMap.putAll(APIUtil.getSystemParams());
		if (format != null || !format.equals(""))
		{
			apiparamsMap.put("format", format);
		}
		apiparamsMap.put("fields", mFields);
		apiparamsMap.put("tid", mTid);

		String sign = APIUtil.md5Signature(apiparamsMap, AppConstants.SECRET);
		apiparamsMap.put("sign", sign);

		String paramsString = APIUtil.getContent(apiparamsMap);
		String responseData = APIUtil.getResult(AppConstants.APIURL,
				paramsString);

		return responseData;
	}

	/**
	 * 搜索当前会话用户作为买家达成的交易记录(目前只能查询三个月以内的订单)
	 * 
	 * @param format
	 * @param mFields
	 * @param start_created
	 *            查询交易创建时间开始。格式:yyyy-MM-dd HH:mm:ss
	 * @param end_created
	 *            查询交易创建时间结束。格式:yyyy-MM-dd HH:mm:ss
	 * @param status
	 *            交易状态，默认查询所有交易状态的数据，除了默认值外每次只能查询一种状态。
	 * @param seller_nick
	 *            卖家昵称
	 * @param type
	 *            交易类型列表，同时查询多种交易类型可用逗号分隔。
	 * @param page_no
	 *            页码。取值范围:大于零的整数; 默认值:1
	 * @param page_size
	 *            每页条数。取值范围:大于零的整数; 默认值:40;最大值:100
	 * @param rate_status
	 *            交易是否评价.默认查询所有评价状态的数据，除了默认值外每次只能查询一种状态。
	 * @return
	 * @throws ApiException
	 */
	public String getBought(String format, String mFields,
			String start_created, String end_created, String status,
			String seller_nick, String type, String page_no, String page_size,
			String rate_status) throws ApiException
	{
		TreeMap<String, String> apiparamsMap = new TreeMap<String, String>();
		apiparamsMap.putAll(APIUtil.getSystemParams());
		if (format != null || !format.equals(""))
		{
			apiparamsMap.put("format", format);
		}
		if (start_created != null || !start_created.equals(""))
		{
			apiparamsMap.put("start_created", start_created);
		}
		if (end_created != null || !end_created.equals(""))
		{
			apiparamsMap.put("end_created", end_created);
		}
		if (status != null || !status.equals(""))
		{
			apiparamsMap.put("status", status);
		}
		if (seller_nick != null || !seller_nick.equals(""))
		{
			apiparamsMap.put("seller_nick", seller_nick);
		}
		if (type != null || !type.equals(""))
		{
			apiparamsMap.put("type", type);
		}
		if (page_no != null || !page_no.equals(""))
		{
			apiparamsMap.put("page_no", page_no);
		}
		if (page_size != null || !page_size.equals(""))
		{
			apiparamsMap.put("page_size", page_size);
		}
		if (rate_status != null || !rate_status.equals(""))
		{
			apiparamsMap.put("rate_status", rate_status);
		}

		apiparamsMap.put("fields", mFields);

		String sign = APIUtil.md5Signature(apiparamsMap, AppConstants.SECRET);
		apiparamsMap.put("sign", sign);

		String paramsString = APIUtil.getContent(apiparamsMap);
		String responseData = APIUtil.getResult(AppConstants.APIURL,
				paramsString);

		return responseData;
	}

	/**
	 * 搜索当前会话用户作为卖家已卖出的交易数据(只能获取到三个月以内的交易信息)
	 * 
	 * @param format
	 * @param mFields
	 * @param start_created
	 *            查询三个月内交易创建时间开始。格式:yyyy-MM-dd HH:mm:ss
	 * @param end_created
	 *            查询交易创建时间结束。格式:yyyy-MM-dd HH:mm:ss
	 * @param status
	 *            交易状态，默认查询所有交易状态的数据，除了默认值外每次只能查询一种状态
	 * @param buyer_nick
	 *            买家昵称
	 * @param type
	 *            交易类型列表，同时查询多种交易类型可用逗号分隔
	 * @param page_no
	 *            页码。取值范围:大于零的整数; 默认值:1
	 * @param page_size
	 *            每页条数。取值范围:大于零的整数; 默认值:40;最大值:100
	 * @param rate_status
	 *            评价状态，默认查询所有评价状态的数据，除了默认值外每次只能查询一种状态。
	 * @param tag
	 *            卖家对交易的自定义分组标签，目前可选值为：time_card（点卡软件代充），fee_card（话费软件代充）
	 * @return
	 * @throws ApiException
	 */
	public String getSold(String format, String mFields, String start_created,
			String end_created, String status, String buyer_nick, String type,
			String page_no, String page_size, String rate_status, String tag)
			throws ApiException
	{
		TreeMap<String, String> apiparamsMap = new TreeMap<String, String>();
		apiparamsMap.putAll(APIUtil.getSystemParams());
		if (format != null || !format.equals(""))
		{
			apiparamsMap.put("format", format);
		}
		if (tag != null || !tag.equals(""))
		{
			apiparamsMap.put("tag", tag);
		}
		if (start_created != null || !start_created.equals(""))
		{
			apiparamsMap.put("start_created", start_created);
		}
		if (end_created != null || !end_created.equals(""))
		{
			apiparamsMap.put("end_created", end_created);
		}
		if (status != null || !status.equals(""))
		{
			apiparamsMap.put("status", status);
		}
		if (buyer_nick != null || !buyer_nick.equals(""))
		{
			apiparamsMap.put("buyer_nick", buyer_nick);
		}
		if (type != null || !type.equals(""))
		{
			apiparamsMap.put("type", type);
		}
		if (page_no != null || !page_no.equals(""))
		{
			apiparamsMap.put("page_no", page_no);
		}
		if (page_size != null || !page_size.equals(""))
		{
			apiparamsMap.put("page_size", page_size);
		}
		if (rate_status != null || !rate_status.equals(""))
		{
			apiparamsMap.put("rate_status", rate_status);
		}

		apiparamsMap.put("fields", mFields);
		String sign = APIUtil.md5Signature(apiparamsMap, AppConstants.SECRET);
		apiparamsMap.put("sign", sign);

		String paramsString = APIUtil.getContent(apiparamsMap);
		String responseData = APIUtil.getResult(AppConstants.APIURL,
				paramsString);

		return responseData;
	}

	/**
	 * <p>1. 搜索当前会话用户作为卖家已卖出的增量交易数据  </p>
	 * <p>2. 只能查询时间跨度为一天的增量交易记录：start_modified：2011-7-1 16:00:00 end_modified： 2011-7-2 15:59:59（注意不能写成16:00:00）  </p>
	 * <p>3. 返回数据结果为创建订单时间的倒序  </p>
	 * <p>4. 只能查询3个月内修改过的数据，超过这个时间的数据无法通过taobao.trade.fullinfo.get获取详情</p>
	 * @param format
	 * @param mFields 需要返回的字段
	 * @param mStart_modified 查询修改开始时间(修改时间跨度不能大于一天)。格式:yyyy-MM-dd HH:mm:ss
	 * @param mEnd_modified 查询修改结束时间，必须大于修改开始时间(修改时间跨度不能大于一天)，格式:yyyy-MM-dd HH:mm:ss。建议使用30分钟以内的时间跨度，能大大提高响应速度和成功率。
	 * @param use_has_next 是否启用has_next的分页方式，如果指定true,则返回的结果中不包含总记录数，但是会新增一个是否存在下一页的的字段，通过此种方式获取增量交易，效率在原有的基础上有80%的提升。
	 * @param status 交易状态，默认查询所有交易状态的数据，除了默认值外每次只能查询一种状态。
	 * @param type 交易类型列表，同时查询多种交易类型可用逗号分隔
	 * @param page_no 页码。取值范围:大于零的整数;默认值:1
	 * @param page_size 每页条数。取值范围：1~100，默认值：40。建议使用40~50，可以提高成功率，减少超时数量
	 * @param tag 卖家对交易的自定义分组标签，目前可选值为：time_card（点卡软件代充），fee_card（话费软件代充）
	 * @return 
	 * @throws ApiException
	 */
	public String getIncrement(String format,String mFields ,String mStart_modified,
			String mEnd_modified, String use_has_next, String status,
			String type, String page_no, String page_size, String tag)
			throws ApiException
	{
		TreeMap<String, String> apiparamsMap = new TreeMap<String, String>();
		apiparamsMap.putAll(APIUtil.getSystemParams());
		if (format != null || !format.equals(""))
		{
			apiparamsMap.put("format", format);
		}
		apiparamsMap.put("mFields", mFields);
		apiparamsMap.put("mStart_modified", mStart_modified);
		apiparamsMap.put("mEnd_modified", mEnd_modified);
		
		if (tag != null || !tag.equals(""))
		{
			apiparamsMap.put("tag", tag);
		}
		if (use_has_next != null || !use_has_next.equals(""))
		{
			apiparamsMap.put("use_has_next", use_has_next);
		}
		if (status != null || !status.equals(""))
		{
			apiparamsMap.put("status", status);
		}
		if (type != null || !type.equals(""))
		{
			apiparamsMap.put("type", type);
		}
		if (page_no != null || !page_no.equals(""))
		{
			apiparamsMap.put("page_no", page_no);
		}
		if (page_size != null || !page_size.equals(""))
		{
			apiparamsMap.put("page_size", page_size);
		}

		apiparamsMap.put("fields", mFields);
		String sign = APIUtil.md5Signature(apiparamsMap, AppConstants.SECRET);
		apiparamsMap.put("sign", sign);

		String paramsString = APIUtil.getContent(apiparamsMap);
		String responseData = APIUtil.getResult(AppConstants.APIURL,
				paramsString);

		return responseData;
	}

}
